// 导入并配置环境变量，从 .env 文件中读取配置
import dotenv from 'dotenv';
dotenv.config();

// 导入必要的模块
import express from 'express';  // Express 框架核心模块
import cors from 'cors';        // 跨域资源共享中间件
import helmet from 'helmet';    // 安全相关的 HTTP 头中间件
import routes from './routes/index.js';  // 路由模块
import responseMiddleware from "./middlewares/response.middleware.js";  // 响应中间件
import errorMiddleware from "./middlewares/error.middleware.js";  // 错误处理中间件
import { API_PREFIX } from "./config/api.config.js"; // API配置
import requestLoggerMiddleware from "./middlewares/request-logger.middleware.js";  // 请求日志记录中间件
import initDatabase from "./config/init.js";  // 数据库初始化模块

// 创建 Express 应用实例
const app = express();

// 设置服务器端口，优先使用环境变量中的 PORT，如果没有则使用 3000
const PORT = process.env.PORT || 3000;

// 配置中间件
app.use(helmet());   // 添加安全相关的 HTTP 头
app.use(cors());     // 启用 CORS，允许跨域请求
app.use(express.json());   // 解析 JSON 格式的请求体
app.use(express.urlencoded({ extended: true }));   // 解析 URL 编码的请求体，extended: true 允许解析复杂对象

// 添加请求日志中间件
app.use(requestLoggerMiddleware);

// 注册响应中间件 - 必须在路由之前注册
app.use(responseMiddleware);   // 注册响应中间件

// 配置路由
app.use(API_PREFIX, routes);   // 所有 API 路由都以API_PREFIX为前缀

// 错误处理中间件 - 必须在所有路由之后注册
app.use(errorMiddleware);   // 统一的错误处理

// 初始化数据库并启动服务器
initDatabase().then(() => {
  app.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
  });
}).catch((err) => {
  console.error('数据库初始化失败:', err);
  process.exit(1);
});

// 导出 app 实例，便于测试或其他模块使用
export default app;